package com.company.Lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

// 公平和非公平--示例
public class StarvationDemo {
    static Lock lock = new ReentrantLock(); // 默认就是非公平 false

    static class Task extends Thread {
        int count = 0; // 统计循环运行次数 每个线程都会有

        @Override
        public void run() {
            while (true) {
                // 每次循环获取一次锁
                lock.lock();// 没拿到锁 等待获取锁的线程 释放锁，然后再去抢
                try {
                    count++; // TODO 统计每个线程 自身 抢锁成功的次数
                    Thread.sleep(100); // TODO 业务逻辑耗时 100ms
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } finally {
                    lock.unlock();// 释放锁
                }
            }
        }
    }

    public static void main(String[] args) throws Exception {
        // 不公平 不平衡--- 部分线程 饥饿 ---

        // TODO 1.启动五个线程
        Task[] threads = new Task[5];
        for (int i = 0; i < 5; i++) {
            Task thread = new Task();
            thread.start();
            threads[i] = thread;
        }

        // TODO 2. 10秒查看运算结果
        Thread.sleep(10_000L);
        for (Task task : threads) {
            System.out.println(task.getName() + ">>>" + task.count);
        }

        // 退出程序
        System.exit(0);
    }


}
